/**
 * 基本的环境配置
 * */
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 提取css为单独文件
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
// 压缩css
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')

// 定义nodejs环境变量：决定使用browserslist的哪个环境
process.env.NODE_ENV = 'development'

/**
 * 缓存：
 *    babel缓存:
 *      cacheDirectory: true
 *    文件资源缓存：
 *      hash：每次webpack构建时会生成一个唯一的hash值。
 *            问题：因为js和css同时使用一个hash值。如果重新打包，会导致所有缓存失效（可能只改动一个文件）。
 *      chunkhash：根据chunk生成的hash值。如果打包来源于同一个chunk，那么hash值就一样
 *            问题：js和css的hash值还是一样的
 *                  因为css是在js中被引入的，所以同属一个chunk
 *      contenthash：根据文件的内容生成hash值。不同文件hash值一定不同（good）
 * */

const commonCSSLoader = [
  MiniCssExtractPlugin.loader,
  'css-loader',
  /**
   * css 兼容性处理 
   * 还需要在package.json中定义browserslist
   * */
  'postcss-loader'

]

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'build.[contenthash:10].js',
    path: `${__dirname}/dist`
  },
  module: {
    rules: [
      {
        /**
         * 以下loader只会匹配一个（类似于react-router中的switch）
         * 注意：不能有两个配置处理同一种类型文件，可以把另一种类型的文件提取出去
         * */
        oneOf: [
          {
            test: /\.css$/,
            use: [
              ...commonCSSLoader
            ]
          },
          {
            test: /\.less$/,
            use: [
              ...commonCSSLoader,
              'less-loader'
            ]
          },
          {
            // js兼容性处理
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            options: {
              presets: [
                // 按需加载
                [
                  '@babel/preset-env',
                  {
                    useBuiltIns: 'usage',
                    corejs: { version: 3 },
                    targets: {
                      chrome: '60',
                      firefox: '50'
                    }
                  }
                ]

              ],
              /** 
               * 开启babel缓存
               * 第二次构建时，会读取之前的缓存
               * */
              cacheDirectory: true
            }
          },
          {
            test: /\.(jpg|png|gif)$/,
            loader: 'url-loader',
            options: {
              limit: 8 * 10 * 1024,
              name: '[hash:8].[ext]',
              outputPath: 'imgs'
            }
          },
          {
            // 负责处理HTML中的图片
            test: /\.html$/,
            loader: 'html-loader'
          },
          {
            // 处理其他资源文件
            exclude: /\.(css|less|js|json|html|jpg|png|gif)$/,
            loader: 'file-loader',
            options: {
              name: '[hash:8].[ext]',
              outputPath: 'media'
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'css/built.[contenthash:10].css'
    }),
    new HtmlWebpackPlugin({
      template: './src/index.html',
      minify: {
        // 移除空格
        collapseWhitespace: true,
        // 移除注释
        removeComment: true
      }
    }),
    new OptimizeCssAssetsWebpackPlugin()
  ],
  mode: 'production',
  // 热加载，特点：只会在内存中加载，不会有任何输出
  devServer: {
    host: "localhost",
    port: 3000,
    compress: true,
    open: true
  }
}